import java.util.Collections;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author understand
 * @description: 可以直接引用已有Java类或对象（实例）的方法或构造器。与lambda联合使用，
 * @create 2025/5/23 17:43
 */
public class FunctionQuoteTest {
    /**
     * 方法引用使用一对冒号 :: 。
     *
     * @param args
     */
    public static void main(String[] args) {

        //1.构造引用
        Car car = Car.create(Car::new);
//        Car car =  new Car();
        List<Car> cars = Collections.singletonList(car);
        //2.静态方法方法
        cars.forEach(item -> Car.collide(item));
        cars.forEach(Car::collide);
        /**
         * TODO：对象实例::实例方法
         *
         * 实例方法引用（对象：：方法）	obj::toString	与实例方法参数列表一致
         * 实例方法引用（类：：方法）	String::length	第一个参数是实例本身，其余参数与方法一致
         * 事件监听
         */
        //3.特定对象的方法引用(引用实例方法)这里的
        //car.follow(policeCar)需要两个参数（car作为this，policeCar作为显式参数），符合follow方法的定义。
        PoliceCar person = new PoliceCar();
        cars.forEach(item -> item.follow(person));
        cars.forEach(car::follow);
//        cars.forEach(Car::follow);
        /**
         * 类名::实例方法
         * 场景 1.集合元素自身操作 2.对象属性转换 List<String>.stream().map(String::toUpperCase)
         */        //4.特定类的任意对象的方法引用(引用实例方法)--对象实例::实例方法
        cars.forEach(item -> item.repair());
        cars.forEach(Car::repair);

    }



}
